﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace psafth.AMB
{
    public class AMBCommand
    {
        private const byte DEFAULT_VERSION = 0x02;

        public static byte[] Passing(int transponderId, int strength, int hits)
        {

            List<byte> bytes = new List<byte>();
            bytes.Add(Convert.ToByte(AMBMessage.SOR));                  // Start Of Record
            bytes.Add(DEFAULT_VERSION);                                 // Version
            bytes.Add(0x00);                                            //
            bytes.Add(0x00);                                            // 
            bytes.Add(0x00);                                            // CRC LSB
            bytes.Add(0x00);                                            // CRC MSB
            bytes.Add(0x00);
            bytes.Add(0x00);
            bytes.Add(Convert.ToByte(AMBMessageType.PASSING));         // Type Of Record
            bytes.Add(0x00);

            // Set data to the field of records

            //PASSING_NUMBER = 0x01,      // (4 byte) (example of "FOR" - 0x01(TOF):0x04(legth):0x00:0x00:0x00:0x00)
            bytes.Add(Convert.ToByte(AMBPassingFOR.PASSING_NUMBER));
            bytes.Add(0x00);
            bytes.Add(0x00);
            bytes.Add(0x00);




            //PASSING_NUMBER = 0x01,      // (4 byte) (example of "FOR" - 0x01(TOF):0x04(legth):0x00:0x00:0x00:0x00)
            //TRANSPONDER = 0x03,         // (4 bytes)
            //RTC_ID = 0x13,              // (4 bytes)
            //RTC_TIME = 0x04,            // (8 byte, time microseconds after January 1, 1970 00:00:00 GMT)
            //UTC_TIME = 0x10,            // (8 byte, time microseconds after January 1, 1970 00:00:00 GMT)
            //STRENGTH = 0x05,            // (2 byte)
            //HITS = 0x06,                // (2 byte)
            //FLAGS = 0x08,               // (2 byte)
            //TRAN_CODE = 0x0a,           // (1 byte)
            //USER_FLAG = 0x0e,           // (4 byte)
            //DRIVER_ID = 0x0f,           // (1 byte)
            //SPORT = 0x14,               // (1 byte)
            //VOLTAGE = 0x30,             // (1 byte, V = (float)voltage/10)
            //TEMPERATURE = 0x31



            // End of record
            bytes.Add(Convert.ToByte(AMBMessage.EOR));

            byte[] tmpBytes = bytes.ToArray();

            // Calculate and insert CRC
            byte[] tmpBytesCRC = AMBCalculator.InsertCRC(tmpBytes);

            // Escape
            byte[] escapedBytes = AMBCalculator.Escape(tmpBytesCRC);

            // Return
            return escapedBytes;




        }

        /// <summary>
        /// Returns the command to get current time on the decoder
        /// </summary>
        /// <returns></returns>
        public static byte[] GetTime()
        {
            // Field of records
            byte[] FORs = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x08, 0x0A, 0x0C };

            // Construct the header
            List<byte> bytes = new List<byte>();
            bytes.Add(Convert.ToByte(AMBMessage.SOR));                  // Start Of Record
            bytes.Add(DEFAULT_VERSION);                                 // Version
            bytes.Add(0x00);                                            //
            bytes.Add(0x00);                                            // 
            bytes.Add(0x00);                                            // CRC LSB
            bytes.Add(0x00);                                            // CRC MSB
            bytes.Add(0x00);
            bytes.Add(0x00);
            bytes.Add(Convert.ToByte(AMBMessageType.GET_TIME));         // Type Of Record
            bytes.Add(0x00);

            // Set data to the field of records
            foreach (byte b in FORs)
            {
                bytes.Add(b);
                bytes.Add(0x00);
            }

            // End of record
            bytes.Add(Convert.ToByte(AMBMessage.EOR));

            byte[] tmpBytes = bytes.ToArray();

            // Calculate and insert CRC
            byte[] tmpBytesCRC = AMBCalculator.InsertCRC(tmpBytes);

            // Escape
            byte[] escapedBytes = AMBCalculator.Escape(tmpBytesCRC);

            // Return
            return escapedBytes;
        }
    }
}
